#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
'''
# python .\photovoltaic_spider\xiaomaizhidian.py main 20250217
import json
from math import log
import sys
from bs4 import BeautifulSoup
import pyautogui
from datetime import datetime, timedelta
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.base import MIMEBase
from email.encoders import encode_base64
import openpyxl
import pandas as pd
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import os
import requests
import logging
from lxml import etree

from fake_useragent import UserAgent
# 设置保存路径
save_pdf_path = r"D:\桌面文件\火炬年报2025年"  # 替换为你希望保存的路径
'''
download_path = 'C:\\Users\\xby_ganweijian\\Downloads'
file_path = "D:/PythonFile/2025年火炬年报_py.xlsx"
executable_path='D:\\python3-11\\chromedriver.exe' # 替换为你的 chromedriver 路径
'''

download_path = 'C:\\Users\\Administrator\\Downloads'
file_path = "D:/桌面文件/火炬年报2025年/2025年火炬年报_py.xlsx"
executable_path='D:\Python\Python312\chromedriver.exe' # 替换为你的 chromedriver 路径D:\\python311\\chromedriver.exe

today = datetime.now()
today_yyyymmdd_str = today.strftime("%Y%m%d")
xiaomaizhidian_url = 'https://hjrz.chinatorch.org.cn/login' #91440900G33759562E \ MAOkang1688
proj_name = '火炬高技术产业开发中心'



# 配置日志记录
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别
    #filename=r'./log/' + proj_name + '_' + plant_name + '_' + today_yyyymmdd_str + '.log',
    format='%(asctime)s - %(levelname)s - %(message)s',  # 设置日志格式
    datefmt='%Y-%m-%d %H:%M:%S',  # 设置日期时间格式
    handlers=[
        logging.FileHandler('./log/' + proj_name  + '_' + today_yyyymmdd_str + '.log'),  # 将日志保存到本地文件，mode='a'  ：表示以追加模式打开文件，避免每次运行脚本时覆盖之前的日志
        logging.StreamHandler()  # 同时将日志输出到控制台
    ]
)

# 定义一个函数，用于获取用户账号和密码并返回列表
def get_user_credentials(file_path):
    # 读取 Excel 文件
    dfp = pd.read_excel(file_path)

    user_credentials = []  # 用于存储用户账号和密码的列表

    # 获取第8列、第9列和第10列的值
    for index, row in dfp.iterrows():
        company_name = row.iloc[1]  # 第2列（索引从0开始）
        tbfzr = row.iloc[3]  # 第4列,填报负责人
        username = row.iloc[7]  # 第8列
        password = row.iloc[8]  # 第9列
        batch_number = row.iloc[9]  # 第10列

        # 检查批次号是否为1
        if batch_number == 1 and pd.notnull(username) and pd.notnull(password) and pd.notnull(tbfzr):  # 确保用户名和密码都不为空
            user_credentials.append((company_name,tbfzr,username, password))  # 将用户名和密码作为元组添加到列表中

    return user_credentials
    
# 定义一个函数，用于更新表格文件第5列第6列和第7列的值,还有批次号的值
def update_columns_for_user(file_path, username,new_value_5, new_value_6, new_value_7):
    # 读取 Excel 文件
    df = pd.read_excel(file_path)

    # 遍历 DataFrame，找到对应的用户名
    for index, row in df.iterrows():
        #logging.info(f"当前遍历到第 {index + 1} 行，用户名: {row.iloc[7]}，username: {username}")
        if row.iloc[7] == username:  # 第8列是用户名
            # 更新第5列到第7列的值
            df.at[index, df.columns[5]] = new_value_6  # 第6列
            df.at[index, df.columns[6]] = new_value_7  # 第7列
            df.at[index, df.columns[9]] = datetime.now().strftime("%Y%m%d")+'已查看'  # 第10列
            #判断第5列的值是否有“已提交”内容，如果有则跳过，如果没有就赋值新值
            '''
            if pd.notnull(row.iloc[4]) and "已提交" in str(row.iloc[4]):  # 第5列是提交状态
                continue
            else:
            '''
            df.at[index, df.columns[4]] = new_value_5  # 第5列
            logging.info(f"已更新用户 {username} 的第5列、第6列和第7列的值为 {new_value_5}、{new_value_6} 和 {new_value_7}。")
            break  # 找到后退出循环
        else:
            continue  # 继续下一行的查找

    # 保存更新后的 DataFrame 回 Excel 文件
    df.to_excel(file_path, index=False)

def get_driver(company_name,tbfzr,username, password):

    ua = UserAgent()

    zname = username
    zpwd = password
    # 配置 Chrome 选项
    chrome_options = Options()
    settings = {
        "recentDestinations": [
            {
                "id": "Save as PDF",
                "origin": "local",
                "account": ""
            }
        ],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isHeaderFooterEnabled": True,  # 勾选页眉和页脚
        "isCssBackgroundEnabled": True,  # 勾选背景图形
        "mediaSize": {
            "height_microns": 297000,
            "name": "ISO_A4",
            "width_microns": 210000,
            "custom_display_name": "A4"
        },
    }
    prefs = {
        'printing.print_preview_sticky_settings.appState': json.dumps(settings),
        'savefile.default_directory': save_pdf_path
    }
    chrome_options.add_argument('--enable-print-browser')
    chrome_options.add_argument('--kiosk-printing')  # 静默打印
    chrome_options.add_experimental_option('prefs', prefs)

    # 初始化 WebDriver
    service = Service(executable_path)  

    options = webdriver.ChromeOptions()
    options.add_argument(f"user-agent={ua.random}")
    # 禁用自动化扩展（关键！）
    options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 隐藏顶部的"Chrome正在受自动化测试控制"
    options.add_experimental_option("useAutomationExtension", False)  # 禁用自动化扩展
    # 关键参数配置
    options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用Blink的自动化控制特征
    options.add_argument("--disable-infobars")  # 禁用信息栏
    options.add_argument("--disable-dev-shm-usage")  # 避免内存不足问题
    options.add_argument("--no-sandbox")  # 非沙箱模式（Linux服务器可能需要）
    options.add_argument("--disable-gpu")  # 禁用GPU加速（旧版系统可能需要）


    # 禁用密码保存提示
    prefs = {
        "credentials_enable_service": False,
        "profile.password_manager_enabled": False
    }
    # 启动浏览器
    browser = webdriver.Chrome(service=service, options=chrome_options)
    # 覆盖navigator.webdriver属性（Chrome 79+ 必须使用CDP）
    browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            });
        """
    })
    # 可选：删除Selenium的全局变量（部分网站检测window.navigator.chrome）
    browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            delete window.navigator.__proto__.chrome;
        """
    })
    browser.get(url=xiaomaizhidian_url)
    browser.maximize_window()  # 设置浏览器大小为全屏 --隐藏窗口不可使用
    browser.implicitly_wait(10)
    # 设置显式等待时间
    wait = WebDriverWait(browser, 20)  # 等待时间可以根据实际情况调整
    try:
        # 打印找到的元素数量
        rclose_xpath = browser.find_elements(By.XPATH, '//*[@id="rollClose"]')
        logging.info(f"找到 '关闭通知' 按钮的数量：{len(rclose_xpath)}")
        # 等待“确定”按钮出现 
        if float(len(rclose_xpath)) == 1:
            rclose_xpath = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="rollClose"]')))
            rclose_xpath.click()
            logging.info("点击 '关闭通知' 按钮。")
            time.sleep(1)  # 等待页面加载完成
        else:
            logging.info("未找到 '关闭通知' 按钮。")
    except Exception as e:
        logging.error(f"程序运行时出现错误: {e}")

    try:
        # 打印找到的元素数量
        rclose_xpath = browser.find_elements(By.XPATH, '/html/body/div/div/div[3]/a')
        logging.info(f"找到 '关闭右下角窗口' 按钮的数量：{len(rclose_xpath)}")
        # 等待“确定”按钮出现 
        if float(len(rclose_xpath)) == 1:
            rclose_xpath = wait.until(EC.presence_of_element_located((By.XPATH,'/html/body/div/div/div[3]/a')))
            rclose_xpath.click()
            logging.info("点击 '关闭右下角窗口' 按钮。")
            time.sleep(1)  # 等待页面加载完成
        else:
            logging.info("未找到 '关闭右下角窗口' 按钮。")
    except Exception as e:
        logging.error(f"程序运行时出现错误: {e}")

    time.sleep(1)
    # 输入账号密码并点击登录
    browser.find_element(By.XPATH, '//*[@id="username"]').send_keys(zname)
    browser.find_element(By.XPATH, '//*[@id="password"]').send_keys(zpwd)
    #time.sleep(1)
    #拉动滑块元素往右拖动
    slider_xpath = '//*[@id="slider"]/div/div/p'
    slider = browser.find_element(By.XPATH, slider_xpath)
    action = webdriver.ActionChains(browser)
    # 模拟缓慢拉动滑块
    action.click_and_hold(slider).perform()  # 按住滑块
    action.click_and_hold(slider).move_by_offset(390, 0).release().perform()
    #time.sleep(1)
    #点击登录按钮
    login_xpath = '//*[@id="btnSubmit"]'
    browser.find_element(By.XPATH, login_xpath).click()
    logging.info("点击登录按钮")
    time.sleep(5)


    '''
    try:
        # 打印找到的元素数量
        rclose_xpath = browser.find_elements(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/iframe')
        logging.info(f"找到 'iframe' 的数量：{len(rclose_xpath)}")
        # 等待“确定”按钮出现 
        if float(len(rclose_xpath)) == 1:
            rclose_xpath = wait.until(EC.presence_of_element_located((By.XPATH,'/html/body/div[1]/div/div/div/div[2]/div/iframe')))
            rclose_xpath.click()
            logging.info("点击 '关闭右下角窗口' 按钮。")
            time.sleep(3)  # 等待页面加载完成
        else:
            logging.info("未找到 '关闭右下角窗口' 按钮。")
    except Exception as e:
        logging.error(f"程序运行时出现错误: {e}")
    '''

    try:  
        # 切换iframe
        iframe = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/iframe')))# //*[@id="tabpanel-2a9025d051-frame"]
        # 切换到 iframe 内部 
        browser.switch_to.frame(iframe)
        logging.info(browser.current_url)  # 打印当前url
        logging.info('进入iframe')
        input_xpath = '/html/body/div/div/div/ul/li[1]/a'  # 我要办理
        # 等待输入框元素出现
        input_element = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.XPATH, input_xpath))
        )
        #input_element.send_keys(Keys.CONTROL, 'a')  # 通过全选上一个数据，再进行更改
        #time.sleep(2)  # 等待页面加载完成
        #input_element.send_keys(yesterday_str)
        browser.find_element(By.XPATH, input_xpath).click()  # 点击
        logging.info('点击我要办理')
        time.sleep(5)  # 等待页面加载完成
    except Exception as e:
        logging.error(f"程序运行时出现错误: {e}")
    time.sleep(3)

    
    # 切换到新窗口
    try:
    #logging.info('获取当前浏览器中所有打开窗口的句柄:',browser.window_handles)
        # 获取新窗口的句柄
        new_window_handle = browser.window_handles[1]  # 假设新窗口是第二个打开的窗口
        browser.switch_to.window(new_window_handle)
        logging.info("切换到新窗口")



        gxbb_xpath = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[2]/div[1]/span[2]/span'
        qynb_xpath = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[3]/div[1]/span[2]/span'
        #判断是否存在gxbb_xpath或者qynb_xpath
        gxbb=len(browser.find_elements(By.XPATH, gxbb_xpath))
        qynb=len(browser.find_elements(By.XPATH, qynb_xpath))
        if gxbb == 1 or qynb == 1:
            logging.info("存在高新技术企业发展情况报表或者企业年报")
        else:
            #避免网络报错，刷新当前页面
            browser.refresh()
            logging.info("刷新当前页面")
            time.sleep(3)

        if gxbb == 1 or qynb == 1:
            
            logging.info("存在高新技术企业发展情况报表或者企业年报")
        else:
            # 关闭当前窗口并返回上一个窗口
            browser.close()
            logging.info("关闭当前网络错误窗口")
            browser.switch_to.window(browser.window_handles[0])
            logging.info("返回上一个窗口")
            time.sleep(3)
            #重新点击我要办理
            logging.info("重新点击我要办理")
            # 切换iframe
            iframe = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/iframe')))# //*[@id="tabpanel-2a9025d051-frame"]
            # 切换到 iframe 内部 
            browser.switch_to.frame(iframe)
            logging.info(browser.current_url)  # 打印当前url
            logging.info('进入iframe')
            input_xpath = '/html/body/div/div/div/ul/li[1]/a'  # 我要办理
            # 等待输入框元素出现
            #input_element = WebDriverWait(browser, 10).until(
            #    EC.presence_of_element_located((By.XPATH, input_xpath))
            #)
            #input_element.send_keys(Keys.CONTROL, 'a')  # 通过全选上一个数据，再进行更改
            #time.sleep(2)  # 等待页面加载完成
            #input_element.send_keys(yesterday_str)
            browser.find_element(By.XPATH, input_xpath).click()  # 点击计算
            logging.info('点击我要办理')
            WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]')))  # 等待主内容加载
    except Exception as e:
        logging.error(f"程序运行时出现错误: {e}")

    
    try:
        # 存在高新技术企业发展情况报表 //*[@id="app"]/section/div/div/div/div/div/div/div/div[2]/div[1]/span[2]/span
        # 存在高新技术企业发展情况报表时,企业年报的元素id为： //*[@id="app"]/section/div/div/div/div/div/div/div/div[3]/div[1]/span[2]/span
        # 不存在高新技术企业发展情况报表时,企业年报的元素id为：企业年报 //*[@id="app"]/section/div/div/div/div/div/div/div/div[2]/div[1]/span[2]/span
        #如果高新技术企业发展情况报表和击企业年报两个元素同时出现，就点击企业年报
        gxbb_xpath = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[2]/div[1]/span[2]/span'
        qynb_xpath = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[3]/div[1]/span[2]/span'
        # 点击数据管理  
        data_xpath_2 = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[3]/div[2]/div[3]/span[3]' # 存在高新技术企业发展情况报表时
        data_xpath_1 = '//*[@id="app"]/section/div/div/div/div/div/div/div/div[2]/div[2]/div[3]/span[3]' # 不存在高新技术企业发展情况报表时
        gxbb=len(browser.find_elements(By.XPATH, gxbb_xpath))
        qynb=len(browser.find_elements(By.XPATH, qynb_xpath))


        #查找状态
        status_code_1 = '//*[@id="app"]/section/section/div/div/main/div[2]/div[2]/div/div/div[2]/div/div[2]/div' ## 不存在高新技术企业发展情况报表时
        status_code_2 = '//*[@id="app"]/section/section/div/div/main/div[2]/div[2]/div[1]/div/div[2]/div/div[2]/div[1]' ## 存在高新技术企业发展情况报表时
        if gxbb == 1 and qynb == 1:

            html_content = browser.find_element(By.XPATH, status_code_2).get_attribute('outerHTML')
            # 使用lxml解析HTML内容
            tree = etree.HTML(html_content)
            # 使用XPath查找并提取文本
            result = tree.xpath('//span[@class="ent-home__cont-left-status"]/text()')
            new_value_5 = result[0] if result else None  # 如果没有找到匹配的元素，返回None
            logging.info(f"提取的文本: {new_value_5}")
        else:
            html_content = browser.find_element(By.XPATH, status_code_1).get_attribute('outerHTML')
            # 使用lxml解析HTML内容
            tree = etree.HTML(html_content)
            # 使用XPath查找并提取文本
            result = tree.xpath('//span[@class="ent-home__cont-left-status"]/text()')
            new_value_5 = result[0] if result else None  # 如果没有找到匹配的元素，返回None
            logging.info(f"提取的文本: {new_value_5}")


        if gxbb == 1 and qynb == 1:
            qynb_xpath = qynb_xpath
            qynb_element = WebDriverWait(browser, 10).until(
                EC.presence_of_element_located((By.XPATH, qynb_xpath))
            )
            qynb_element.click()
            logging.info("存在高新技术企业发展情况报表,点击企业年报")
            # 点击数据管理  
            data_element = WebDriverWait(browser, 10).until(
                EC.presence_of_element_located((By.XPATH, data_xpath_2))
            )
            data_element.click()
            logging.info("点击企业年报_数据管理")    
        else:
            qynb_xpath = gxbb_xpath
            qynb_element = WebDriverWait(browser, 10).until(
                EC.presence_of_element_located((By.XPATH, qynb_xpath))
            )
            qynb_element.click()
            logging.info("不存在高新技术企业发展情况报表，点击企业年报")
            # 点击数据管理  
            data_element = WebDriverWait(browser, 10).until(
                EC.presence_of_element_located((By.XPATH, data_xpath_1))
            )
            data_element.click()
            logging.info("点击企业年报_数据管理") 
            time.sleep(3)

    except Exception as e:
        logging.error(f"点击企业年报-数据管理时出现错误: {e}")
    time.sleep(3)
    
    #获取元素的HTML文本内容
    try:
        html_content = browser.find_element(By.XPATH, '//*[@id="app"]/section/section/div/div/main/div[2]/div/div[2]').get_attribute('outerHTML')
        # 解析 HTML
        tree = etree.HTML(html_content)
        # 将 lxml 的 Element 对象转换为字符串
        html_string = etree.tostring(tree, encoding='unicode')
        soup = BeautifulSoup(html_string, 'html.parser')
        logging.info("解析HTML成功")  
    except Exception as e:
        logging.error(f"获取元素的HTML文本内容时出现错误: {e}")
    time.sleep(3)

  # 定位表头获取列索引
    headers = soup.select('th') #获取表格的所有表头单元格（ <th> 标签）
    #用于存储“账号”的索引，初始值为 None 。
    account_col = None
 
    #遍历表头单元格，查找包含“账号”的列，并记录它们的索引。
    for idx, th in enumerate(headers):
        text = th.get_text(strip=True)
        #logging.info("遍历表头单元格",text)
        if '账号' in text:
            account_col = idx
        if account_col is not None:
            break
    logging.info(f"遍历表头单元格账号索引：{account_col}")

    # 遍历行数据
    #遍历表格的每一行（ <tr> 标签），并提取“账号”列的值。
    #如果找到“账号”列的值等于指定的 zname ，则提取第10到13列的值。
    #如果未找到匹配的行，则打印一条消息。
    try:
        if account_col is not None :
            for row in soup.select('tbody tr'):
                cells = row.select('td')
                if cells[account_col].get_text(strip=True):
                    account_value = cells[account_col].get_text(strip=True)
                    
                    if account_value == zname:
                        logging.info(f"账号: {account_value}")
                        #遍历索引从10到13的单元格，提取它们的值，并保存这四个值成列表
                        state_data = []
                        for idx in range(9, 13):
                            if idx < len(cells):
                                a_tag = cells[idx].find('a')
                                if a_tag:
                                    state_data.append(a_tag.get_text(strip=True))
                                else:
                                    state_data.append(None)
                            else:
                                state_data.append(None)
                        logging.info(f"数据: {state_data}")
                    else:
                        logging.info("未找到账号为{zname}的记录")   
                                             
        else:
            logging.info("表头解析失败")
    except Exception as e:
        logging.error(f"遍历行数据时出现错误: {e}")

    test = len(browser.find_elements(By.XPATH, '//*[@class="arco-icon arco-icon-eye"]'))
    logging.info(f"查看按钮元素数量：{test}")

    #判段查看按钮元素是否存在，如果存在则点击，如果不存在就返回输出不存在
    try:                                      
        if len(browser.find_elements(By.XPATH, '//*[@class="arco-icon arco-icon-eye"]')) == 1:
            browser.find_element(By.XPATH, '//*[@class="arco-icon arco-icon-eye"]').click()
            logging.info("点击查看")
            time.sleep(3)

            # 获取新窗口的句柄
            new_window_handle = browser.window_handles[2]  # 假设新窗口是第二个打开的窗口
            browser.switch_to.window(new_window_handle)
            logging.info("切换到新窗口")
            #logging.info(browser.current_url)  # 打印当前url
            time.sleep(3)

            # 解析HTML内容
            html_content = browser.find_element(By.XPATH, '/html/body').get_attribute('outerHTML')
            parser = etree.HTMLParser()
            tree = etree.fromstring(html_content, parser)
            time.sleep(3)
            # 使用XPath表达式检查是否包含“已审核”
            xpath_query = "//div[contains(text(), '已审核')]"
            result_s = tree.xpath(xpath_query)
            # 判断结果
            if result_s:
                logging.info("包含'已审核'，判断结果为：True")
                state_data_4 = "已审核"
            else:
                logging.info("不包含'已审核'，判断结果为：False")
                state_data_4 = "未审核"
            logging.info(f"state_data_4: {state_data_4}")
            # 关闭当前窗口并返回上一个窗口
            new_window_handle = browser.window_handles[1]  # 假设新窗口是第二个打开的窗口
            browser.switch_to.window(new_window_handle)
            logging.info("切换到新窗口")
            logging.info(browser.current_url)  # 打印当前url
            time.sleep(3)
        else:
            state_data_4 = "未审核"
            logging.info("不存在查看按钮")





    except Exception as e:
        logging.error(f"点击查看按钮时出现错误: {e}")
    time.sleep(1)








    #判断state_data[1]='已审'或者state_data[2]='已审'或者state_data[3]='已审'条件成立时，打印“数据已审核”，并退出程序。
    if state_data[1] == '已审' or state_data[2] == '已审' or state_data[3] == '已审' or state_data_4 == "已审核":
        #new_value_5=state_data[0]
        new_value_6='已审' 
        logging.info("数据已审核")

        # 点击打印
        try:                
            dayin_xpath = '//*[@id="app"]/section/section/div/div/main/div[2]/div/div[2]/div/div/div/div/div/table/tbody/tr/td[14]/span/span/a'
            qynb_element = WebDriverWait(browser, 10).until(
                EC.presence_of_element_located((By.XPATH, dayin_xpath))
            )
            qynb_element.click()
            logging.info("点击打印进入PDF预览")
            time.sleep(5)
        except Exception as e:
            logging.error(f"点击打印时出现错误: {e}")
        time.sleep(3)


        # 切换到新窗口,处理打印pdf
        try:
            # 获取新窗口的句柄
            new_window_handle = browser.window_handles[2]  # 假设新窗口是第二个打开的窗口
            browser.switch_to.window(new_window_handle)
            logging.info("切换到PDF窗口")
            time.sleep(3)
            '''
            # 设置点击的坐标（x, y）
            x, y = 100, 200  # 替换为你想要点击的屏幕坐标
            # 等待3秒，以便你有时间将鼠标移动到目标位置
            time.sleep(1)
            # 模拟鼠标移动到指定坐标
            pyautogui.moveTo(x, y, duration=1)  # duration参数控制移动速度
            # 模拟鼠标点击
            pyautogui.click()
            '''

            #单击去掉图片
            tupiao_xpath = '//*[@id="app"]/div[1]/img'
            browser.find_element(By.XPATH, tupiao_xpath).click()
            logging.info("单击去掉图片")
            time.sleep(5)
            #save_pdf_path
            # 触发打印
            browser.execute_script('window.print();')
            # 等待打印完成
            time.sleep(15)
            new_value_7='已下载'



            #修改打印保存的文件名
            current_time = datetime.now()
            # 格式化时间为字符串，例如：2025-04-08
            formatted_time = current_time.strftime("%Y-%m-%d")
            # 构造新的文件名 
            new_filename = f"{tbfzr}_{company_name}_{formatted_time}.pdf"
            # 构造新的文件路径
            new_file_path = os.path.join(save_pdf_path, new_filename)
            logging.info(f"新的文件路径: {new_file_path}")
            # 检查是否存在同名文件，如果存在则删除
            if os.path.exists(new_file_path):
                os.remove(new_file_path)
                logging.info(f"已删除旧文件: {new_file_path}")
                time.sleep(2)
            # 重命名文件
            os.rename(os.path.join(save_pdf_path, '火炬统计系统.pdf'), new_file_path)
            logging.info(f"文件已保存为: {new_file_path}")
            time.sleep(3)

            
        except Exception as e:
            logging.error(f"程序运行时出现错误: {e}")


    else:
        #new_value_5=state_data[0]
        new_value_6='未审'
        new_value_7='未下载'






    return browser,new_value_5,new_value_6, new_value_7



def main():

    # 调用函数获取用户账号和密码
    user_credentials = get_user_credentials(file_path)
    logging.info(f"获取到 {len(user_credentials)} 个用户的账号和密码。")

    for company_name,tbfzr,username, password in user_credentials:

        #打印正在运行第几个账号
        logging.info(f"正在运行第{[cred[2] for cred in user_credentials].index(username) + 1}个账号")

        max_retries = 1  # 最大重试次数
        retries = 0
        while retries <= max_retries:
            try:
                browser,new_value_5,new_value_6, new_value_7 = get_driver(company_name,tbfzr,username, password)
                browser.quit()

                update_columns_for_user(file_path, username,new_value_5, new_value_6, new_value_7)
                logging.info(f"已更新用户 {username} 的第6列和第7列的值为 {new_value_6} 和 {new_value_7}。")
                time.sleep(5)
                break  # 如果没有错误，跳出重试循环
            #出现错误再重跑一次，尽量避免可能网络延迟导致xpath获取失败的情况
            except Exception as e:
                retries += 1
                if retries <= max_retries:
                    logging.error(f"程序运行时出现错误: {e}，正在进行第 {retries} 次重试...")
                else:
                    logging.info("已达到最大重试次数，停止重试。")
                    logging.error(f"程序运行时出现错误: {e}")

    #在save_pdf_path路径下查找所有以.pdf结尾的文件，按照username分组新建文件夹，将文件移动到对应的文件夹中
    # 获取当前目录下所有的文件
    files = os.listdir(save_pdf_path) 
    # 遍历文件列表
    for file in files:
        # 检查文件是否以.pdf结尾
        if file.endswith('.pdf'):
            # 提取文件名中的用户名部分
            tbfzr_part = file.split('_')[0]
            # 构造新的文件夹路径    
            new_folder_path = os.path.join(save_pdf_path, tbfzr_part)
            # 检查文件夹是否存在，如果不存在则创建
            if not os.path.exists(new_folder_path):
                os.makedirs(new_folder_path)
            # 构造源文件路径和目标文件路径
            source_path = os.path.join(save_pdf_path, file)
            destination_path = os.path.join(new_folder_path, file)
            # 检查目标文件是否已存在，如果存在则删除
            if os.path.exists(destination_path):
                os.remove(destination_path)
            # 移动文件到新的文件夹
            os.rename(source_path, destination_path)
            logging.info(f"文件 {file} 已移动到文件夹 {tbfzr_part}")
            time.sleep(2)

if __name__ == '__main__':
        
    main()

